#include "stm32f1xx_hal.h"
#include <string.h>
#include <math.h>
#include <stdio.h>   // 添加：用于 sprintf

// 整数转字符串（支持符号和小数点计入总长度）
// 整数转字符串（符号计入总长度，无小数点）
void IntToStr(int num, char *buffer, int width) {
    int i = 0;
    int isNegative = 0;
    unsigned int n;

    // 处理符号
    if (num < 0) {
        isNegative = 1;
        n = (unsigned int)(-num);  // 转换为正数处理
    } else {
        n = (unsigned int)num;
    }

    // 转换整数部分（逆序存储）
    char temp[20];  // 存储整数部分（逆序）
    do {
        temp[i++] = (n % 10) + '0';
        n /= 10;
    } while (n != 0);
    int digitCount = i;  // 实际数字位数（不包含符号）

    // 计算总需要的位数（符号+数字）
    int totalRequired = isNegative ? 1 : 0;  // 符号位
    totalRequired += digitCount;            // 数字部分

    // 计算需要补零的位数
    int zerosNeeded = width - totalRequired;
    if (zerosNeeded < 0) zerosNeeded = 0;  // 宽度不足时不补零

    // 构建字符串
    int bufferIdx = 0;

    // 写符号位
    if (isNegative) {
        buffer[bufferIdx++] = '-';
    }

    // 补零（左侧补零，符号后补零）
    for (int j = 0; j < zerosNeeded; j++) {
        buffer[bufferIdx++] = '0';
    }

    // 写数字部分（逆序转正序）
    for (int j = digitCount - 1; j >= 0; j--) {
        buffer[bufferIdx++] = temp[j];
    }

    // 结束字符串
    buffer[bufferIdx] = '\0';
}


// 整数转字符串（保留之前的修复版本）
void IntToStr_1(int num, char *buffer) {
    int i = 0;

    if (num < 0) {
        buffer[i++] = '-';
    } else if (num == 0) {
        buffer[i++] = '0';
        buffer[i] = '\0';
        return;
    }

    char temp[12];
    int j = 0;
    int n = num;
    while (n != 0) {
        int digit = n % 10;
        if (digit < 0) digit = -digit;
        temp[j++] = digit + '0';
        n /= 10;
    }

    for (int k = 0; k < j; k++) {
        buffer[i++] = temp[j - k - 1];
    }

    buffer[i] = '\0';
}

// 浮点数转字符串（符号和小数点计入总长度）
void FloatToStr(float num, char *buffer, int decimalPlaces, int totalLength, int showPlus) {
    // 处理特殊值：0
    const float eps = 1e-6;
    if (fabs(num) < eps) {
        // 计算0的输出格式（符号+0+小数点+小数位）
        sprintf(buffer, "%s0.%0*d", showPlus ? "+" : "", decimalPlaces, 0);
        return;
    }

    // 处理符号
    int isNegative = (num < 0);
    float absNum = fabs(num);
    int wholePart = (int)absNum;
    float decimalPart = absNum - wholePart;

    // 计算整数部分的位数
    int intDigits = 1;
    int temp = wholePart;
    if (temp == 0) intDigits = 0;  // 处理整数部分为0的情况
    while (temp > 0) {
        temp /= 10;
        intDigits++;
    }

    // 计算总需要的位数（符号+整数+小数点+小数）
    int signLen = (isNegative || showPlus) ? 1 : 0;      // 符号位
    int totalRequired = signLen + intDigits + 1 + decimalPlaces;  // 符号+整数+小数点+小数

    // 计算需要补零的位数（左侧补零）
    int zerosNeeded = totalLength - totalRequired;
    if (zerosNeeded < 0) zerosNeeded = 0;

    // 构建字符串
    int i = 0;

    // 写符号位
    if (isNegative) {
        buffer[i++] = '-';
    } else if (showPlus) {
        buffer[i++] = '+';
    }

    // 补零（符号后补零）
    for (int j = 0; j < zerosNeeded; j++) {
        buffer[i++] = '0';
    }

    // 转换整数部分（处理整数为0的情况）
    if (wholePart == 0 && (isNegative || showPlus)) {
        buffer[i++] = '0';  // 符号后补0（如 "-0.123"）
    } else {
        char intBuffer[20];
        IntToStr_1(wholePart, intBuffer);
        for (int j = 0; intBuffer[j] != '\0'; j++) {
            buffer[i++] = intBuffer[j];
        }
    }

    // 添加小数点
    buffer[i++] = '.';

    // 转换小数部分
    for (int j = 0; j < decimalPlaces; j++) {
        decimalPart *= 10;
        int digit = (int)decimalPart;
        buffer[i++] = digit + '0';
        decimalPart -= digit;
    }

    buffer[i] = '\0';  // 结束字符串
}


